// 配置路由
import Vue from 'vue'
import VueRouter from 'vue-router'
// 使用插件
Vue.use(VueRouter);
// 引入路由信息
import routes from './routes'
// 引入仓库store
import store from '@/store'
// 先把VueRouter原型对象的push，先保存一份
let originPush=VueRouter.prototype.push;
let originReplace=VueRouter.prototype.replace;
/* 
    重写push|replace方法
        第一个参数：告诉原来push方法，往哪里跳转(传递那些参数)
        第二个参数：成功的回调
        第三个参数：失败的回调
*/
VueRouter.prototype.push=function(location,resolve,reject){
    if(resolve && reject){
        /**
         * call与apply区别：
         *      相同点：都可以调用函数一次，可以篡改函数的上下文一次
         *      不同点：call和apply传递参数，call传递参数用逗号隔开，apply方法执行，传递数组
         */
        originPush.call(this,location,resolve,reject)
    }else{
        originPush.call(this,location,()=>{},()=>{})
    }
}
VueRouter.prototype.replace=function(location,resolve,reject){
    if(resolve && reject){
        originReplace.call(this,location,resolve,reject)
    }else{
        originReplace.call(this.location,()=>{},()=>{})
    }
}

// 暴露路由并配置路由
let router= new VueRouter({
    // 配置路由
    routes,
    // 滚动行为
    scrollBehavior(to,from,savedPosition){
        /**
         * x:0 横着的滚动条
         * y:0 竖着的滚动条
         *        代表滚动条距离最上方是0px，滚动条在最顶上
         */
        return {y:0}
    }
})

// 全局守卫：前置守卫，在路由跳转前进行判断
router.beforeEach( async (to,from,next)=>{
    /**
     * to:可以获取到要跳转到哪个路由信息
     * from:可以获取到从那个路由来的信息
     * next():放行函数
     * next('/login'):放行到指定位置
     * next(false):中断当前的导航，如果url改变，那么会重置到from路由对应的地址
     */
    // 用户登陆了才会有token
    let token = store.state.user.token 
    // 用户信息
    let name =store.state.user.userInfo.name
    if(token){
        // 用户已经登录了,不能去login,停留在首页
        if(to.path == '/login' || to.path == '/register'){
            next('/home')
        }else{
            // 登陆了但是去的不是login
            if(name){
                // 如果有用户信息
                next()
            }else{
                // 没有用户信息，派发action，让仓库存储用户信息在跳转
                try {
                    // 获取用户信息成功
                    await store.dispatch('getUserInfo')
                    // 放行
                    next()
                } catch (error) {
                    // token失效了，清除token
                    await store.dispatch('userLogout');
                    next('/login')
                }
            }
        }

    }else{
        // 未登录,不能去交易，交易，个人中心
        let toPath=to.path
        if(toPath.indexOf('/trade') != -1 || toPath.indexOf("/pay") != -1 || toPath.indexOf("/center") != -1){
            // 把未登录的时候想去，但没有去成的信息，存储与地址栏中
            next('/login?redirect='+toPath)
        }else{
            next()
        }
        
    }
    
})

export default router;